package com.demo.webapp.ui.displayer;

import java.io.IOException;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;

import com.demo.webapp.ui.Component;

/**
 * 组件展示接口
 * 该接口为不同组件提供调用展现层方法。
 * 
 * @author ryuu.kk
 *
 */
public interface Displayer<T extends Component> {
	
	public static final String DEFAULT_CONFIG = "com.demo.webapp.ui.displayer.DisplayerStrings";
	public static final String _SELF = "_self";
    public static final String NBSP = "&nbsp;";
    public static final String EMPTY = "";
    
    //~ Methods ================================================================
    /**
     * 调用display前的初始化方法
     *
     * @param pageContext JSP的page上下文,为展现层(display)提供数据基础和i/o接口
     * @param mapping Displayer的容器对象
     */
    void init(PageContext pageContext, DisplayerMapping mapping);
    
    /**
     * 显示方法
     * @param model 组件模型
     * @throws JspException Jsp调用异常
     * @throws IOException i/o异常
     */
    void display(T model) throws JspException, IOException;
    /**
     * 渲染结束处理方法
     * @param pageContext JSP的page上下文
     * @throws JspException Jsp调用异常
     * @throws IOException i/o异常
     */
    void end(PageContext pageContext) throws JspException;
    /**
     * 设置展示器的类型
     * @return 展示器类型
     */
    String getType();
    
    /**
     * 设置<code>Displayer</code>名称.
     * @param name New value of property name.
     */
    void setName(String name);
    
    /**
     * 返回<code>Displayer</code>名称.
     * @return Displayer对象名称
     */
    String getName();
    
    /**
     * 设置<code>Displayer</code>的附加属性
     * @param config属性
     */
    void setConfig(String config);
    
    /**
     * 返回<code>Component</code>
     * 该配置字段为Displayer提供附加的属性
     * <p>如果是模板渲染器,该Config提供模板名称</p>
     * @return Displayer对象的资源配置
     */
    String getConfig();
    
    /**
     * 设置默认目标地址
     * @param target 目标地址
     */
    void setTarget(String target);

    /**
     * 返回一个默认的目标地址
     * 该地址当组件的地址为空时,使用该地址
     * @return 默认目标地址
     */
    String getTarget();
}
